<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 数组转为map
    const map = new Map([
      ['a', 1],
      ['b', 2]
    ])
    console.log(map, 'map');
    // map转化为数组
    const arr = [...map]
    console.log(arr, 'arr');

    // map转化为对象
    let obj = {}
    map.forEach((value, key, m) => {
      obj[key] = value;
    })
    console.log(obj, 'obj');

    // 所有map的键都是字符串，可以无损的转化为对象
    function strMapToObj (strMap) {
      let obj = Object.create(null)
      for (let [k, v] of strMap) {
        obj[k] = v
      }
      return obj;
    }
    const map2 = new Map([
      ['a', 1],
      ['b', 2]
    ])
    let obj2 = strMapToObj(map2)
    console.log(obj2, 'obj2');

    // 对象转化为map
    let obj3 = {a: 1, b: 2}
    // Object.entries(obj3)返回的是所有可遍历属性的键值对数组，二维(忽略属性是Symbol的情况)
    let map3 = new Map(Object.entries(obj3)) // new Map([[a, 1], [b, 2]])
    console.log(map3, 'map3');

    // 自己实现转化的函数
    function objToMap(obj) {
      let map = new Map()
      for (let key in obj) {
        map.set(key, obj[key])
      }
      return map
    }
    console.log(objToMap(obj3), 'objToMap(obj3)');

    // map转化为对象json-如果map的键都是字符串，可以直接转化为对象json
    function strMapToJson(map) {
      return JSON.stringify(strMapToObj(map))
    }
    let map5 = new Map().set('true', 1).set('false', 2)
    console.log(strMapToJson(map5), 'map5');
    
    function mapToArrayJson(map) {
      // ...map.entries()等同于...map
      return JSON.stringify([...map.entries()])
    }
    // map转化为数组json-map的key里面包含了非字符串
    let map6 = new Map().set(false, 7).set(true, 5)
    console.log(mapToArrayJson(map6));


    // json转化为map-键都是字符串
    function jsonToStrMap(jsonStr) {
      return objToMap(JSON.parse(jsonStr))
    }
    console.log(jsonToStrMap('{"yes": true, "no": false}'));


    // json转化为map 整个json就是一个数组 每个成员本身 又是一个有两个成员的数组
    function jsonArrToMap(jsonArr) {
      return new Map(JSON.parse(jsonArr))
    }
    console.log(jsonArrToMap('[[true,7],[{"foo":3},["abc"]]]'));
  </script>
</body>
</html>